package day22.collection;

import java.util.*;

/**
 * List接口方法测试类
 * 涵盖List接口的所有基础方法的详细测试
 */
public class ListMethodTest {
    public static void main(String[] args) {
        // 1. 创建ArrayList实例进行测试
        List<String> list = new ArrayList<>();
        
        System.out.println("=== List接口方法详细测试 ===\n");
        
        // 2. 测试添加元素相关方法
        System.out.println("1. 测试添加元素方法:");
        
        // add(E e) - 在列表末尾添加元素
        list.add("apple");
        list.add("banana");
        list.add("orange");
        System.out.println("   add(E e)方法添加元素后: " + list);
        
        // add(int index, E element) - 在指定位置插入元素
        list.add(1, "grape");
        System.out.println("   add(int index, E element)在索引1插入grape后: " + list);
        
        // addAll(Collection<? extends E> c) - 添加集合中所有元素
        List<String> moreFruits = new ArrayList<>();
        moreFruits.add("watermelon");
        moreFruits.add("pineapple");
        list.addAll(moreFruits);
        System.out.println("   addAll(Collection c)添加更多水果后: " + list);
        
        // addAll(int index, Collection<? extends E> c) - 在指定位置添加集合中所有元素
        List<String> additionalFruits = new ArrayList<>();
        additionalFruits.add("mango");
        additionalFruits.add("peach");
        list.addAll(2, additionalFruits);
        System.out.println("   addAll(int index, Collection c)在索引2插入更多水果后: " + list);
        
        // 3. 测试访问元素相关方法
        System.out.println("\n2. 测试访问元素方法:");
        
        // get(int index) - 获取指定位置的元素
        String element = list.get(0);
        System.out.println("   get(0)获取索引0的元素: " + element);
        
        // indexOf(Object o) - 返回指定元素第一次出现的索引
        int index = list.indexOf("banana");
        System.out.println("   indexOf(\"banana\")返回banana第一次出现的索引: " + index);
        
        // lastIndexOf(Object o) - 返回指定元素最后一次出现的索引
        list.add("apple"); // 添加重复元素
        int lastIndex = list.lastIndexOf("apple");
        System.out.println("   lastIndexOf(\"apple\")返回apple最后一次出现的索引: " + lastIndex);
        list.remove(list.size() - 1); // 移除刚刚添加的重复元素
        
        // 4. 测试修改元素相关方法
        System.out.println("\n3. 测试修改元素方法:");
        
        // set(int index, E element) - 替换指定位置的元素
        String oldElement = list.set(0, "strawberry");
        System.out.println("   set(0, \"strawberry\")将索引0元素替换为strawberry，原元素: " + oldElement);
        System.out.println("   替换后列表: " + list);
        
        // 5. 测试移除元素相关方法
        System.out.println("\n4. 测试移除元素方法:");
        
        // remove(int index) - 移除指定位置的元素
        String removedElement = list.remove(0);
        System.out.println("   remove(0)移除索引0的元素: " + removedElement);
        System.out.println("   移除后列表: " + list);
        
        // remove(Object o) - 移除指定元素的第一个匹配项
        boolean isRemoved = list.remove("banana");
        System.out.println("   remove(\"banana\")移除banana元素: " + isRemoved);
        System.out.println("   移除后列表: " + list);
        
        // 6. 测试查询方法
        System.out.println("\n5. 测试查询方法:");
        
        // size() - 返回列表中元素个数
        int size = list.size();
        System.out.println("   size()获取列表大小: " + size);
        
        // isEmpty() - 判断列表是否为空
        boolean isEmpty = list.isEmpty();
        System.out.println("   isEmpty()判断列表是否为空: " + isEmpty);
        
        // contains(Object o) - 判断列表是否包含指定元素
        boolean contains = list.contains("orange");
        System.out.println("   contains(\"orange\")判断是否包含orange: " + contains);
        
        // 7. 测试子列表相关方法
        System.out.println("\n6. 测试子列表方法:");
        
        // subList(int fromIndex, int toIndex) - 返回指定范围的子列表
        List<String> subList = list.subList(1, 4);
        System.out.println("   subList(1, 4)获取索引1到3的子列表: " + subList);
        
        // 8. 测试转换为数组方法
        System.out.println("\n7. 测试转换为数组方法:");
        
        // toArray() - 转换为Object数组
        Object[] objectArray = list.toArray();
        System.out.println("   toArray()转换为Object数组: " + Arrays.toString(objectArray));
        
        // toArray(T[] a) - 转换为指定类型的数组
        String[] stringArray = list.toArray(new String[0]);
        System.out.println("   toArray(T[] a)转换为String数组: " + Arrays.toString(stringArray));
        
        // 9. 测试迭代器相关方法
        System.out.println("\n8. 测试迭代器方法:");
        
        // iterator() - 返回迭代器
        Iterator<String> iterator = list.iterator();
        System.out.print("   iterator()遍历列表: ");
        while (iterator.hasNext()) {
            System.out.print(iterator.next() + " ");
        }
        System.out.println();
        
        // listIterator() - 返回列表迭代器
        ListIterator<String> listIterator = list.listIterator();
        System.out.print("   listIterator()正向遍历: ");
        while (listIterator.hasNext()) {
            System.out.print(listIterator.next() + " ");
        }
        System.out.println();
        
        // listIterator(int index) - 从指定位置开始返回列表迭代器
        ListIterator<String> listIteratorFromIndex = list.listIterator(2);
        System.out.print("   listIterator(2)从索引2开始遍历: ");
        while (listIteratorFromIndex.hasNext()) {
            System.out.print(listIteratorFromIndex.next() + " ");
        }
        System.out.println();
        
        // 10. 测试清空列表方法
        System.out.println("\n9. 测试清空列表方法:");
        
        // clear() - 移除所有元素
        list.clear();
        System.out.println("   clear()清空列表后列表内容: " + list);
        System.out.println("   清空后列表大小: " + list.size());
        System.out.println("   清空后列表是否为空: " + list.isEmpty());
        
        // 11. 测试LinkedList实现
        System.out.println("\n10. 测试LinkedList实现:");
        List<Integer> linkedList = new LinkedList<>();
        linkedList.add(1);
        linkedList.add(2);
        linkedList.add(3);
        System.out.println("   LinkedList添加元素后: " + linkedList);
        
        // LinkedList特有的方法
        LinkedList<Integer> actualLinkedList = new LinkedList<>(linkedList);
        actualLinkedList.addFirst(0);
        actualLinkedList.addLast(4);
        System.out.println("   LinkedList添加首尾元素后: " + actualLinkedList);
        
        Integer first = actualLinkedList.getFirst();
        Integer last = actualLinkedList.getLast();
        System.out.println("   getFirst()获取第一个元素: " + first);
        System.out.println("   getLast()获取最后一个元素: " + last);
        
        Integer removedFirst = actualLinkedList.removeFirst();
        Integer removedLast = actualLinkedList.removeLast();
        System.out.println("   removeFirst()移除第一个元素: " + removedFirst);
        System.out.println("   removeLast()移除最后一个元素: " + removedLast);
        System.out.println("   移除首尾元素后: " + actualLinkedList);
        
        System.out.println("\n=== List接口方法测试完成 ===");
    }
}